import os
import sys
import time

# 装饰器模板
from functools import wraps


def decorator(fn):  # fn为目标函数
    def inner():
        """执行函数之前"""
        fn()  # 执行被装饰的函数
        """执行函数之后"""

    return inner


# def timer(func):
#
#     def inner():
#         start = time.time()
#         result = func()
#         end = time.time()
#         print(f'函数{func.__name__}执行的时间是：{end-start}')
#         return result
#     return inner
#
#
# @timer
# def test1():
#     print('test1')
#     time.sleep(1)
#
# @timer
# def test2():
#     print('test2')
#     time.sleep(1)
#
# if __name__ == '__main__':
#     test1()
#     test2()


# 带有参数的装饰器
# 编写一个装饰器，为多个函数加上认证功能，（用户的账户密码来源于文件），要求登录成功一次，后续的函数都无需再输入用户名和密码，直接可以执行。要求文件可以自定义

def login(password_file):
    """
    定义一个装饰器
    1、如果文件存在 读取文件中的内容（用户信息）
    2、文件不存在，创建文件 把信息录入
    :param password_file: 保存用户名和密码的文件 一行保存一个用户{’username‘:用户名，’password‘:密码}
    :return:
    """

    def login_decorator(func):
        user_login_flag = False  # 用户还没有认证
        # 用户之前的准备工作
        users = []  # 存储所有用户信息
        if os.path.exists(password_file):  # 文件存在 读取
            with open(password_file) as f:
                lines = f.readlines()
                for line in lines:  # 其中一行代表一个用户
                    user = eval(line)  # 把字符串当成字典
                    users.append(user)
        else:  # 文件不存在
            choice = input('是否要创建新用户（Y/N）')
            if choice == 'y' or choice == 'Y':
                with open(password_file, mode='w') as f:
                    username = input('请输入新的用户名：')
                    password = input('请输入新的密码：')
                    user = {'username': username, 'password': password}
                    users.append(user)
                    # 写入文件
                    f.write(str(user) + '\n')
            else:
                print('没有用户信息，无法完成用户认证，只能退出！')
                sys.exit(1)

        @wraps(func) # 用这个内置的装饰器来做一下伪装
        def inner(*args, **kwargs):
            # 用户认证
            nonlocal user_login_flag
            if user_login_flag is False:  # 用户没有登录
                ur = input('请输入登录用户名：')
                pwd = input('请输入登录密码：')
                for u in users:
                    if ur == u['username'] and pwd == u['password']:
                        print(f'登录成功，欢迎{ur}登录')
                        user_login_flag = True
                        break
                    else:  # 没有找到用户名相同的
                        print('你输入的用户名和密码由误')

            if user_login_flag:
                return func(*args, **kwargs)

        return inner

    return login_decorator


@login('user.txt')
def test1():
    print('test1')


if __name__ == '__main__':
    print(test1.__name__)
    test1()
    time.sleep(2)
    test1()
